{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from src.dists import compute_distortions_dists, S, compute_random_dists, norm_hamming, compute_distortions_dists_preloaded\n",
    "from src.utils import load_images\n",
    "from src import ops, search_metrics\n",
    "from src.pdq_hash import pdq_hash"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# магия для перезагрузки импортов\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "import builtins\n",
    "from IPython.lib import deepreload\n",
    "builtins.reload = deepreload.reload\n",
    "%reload_ext autoreload"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import imagehash\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import scipy.stats as stats\n",
    "import csv\n",
    "import pandas as pd\n",
    "import seaborn\n",
    "import pdqhash\n",
    "from PIL import Image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "Lenna = Image.open(\"Lenna.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "all_hashes = [imagehash.average_hash,\n",
    "              imagehash.dhash,\n",
    "              imagehash.phash,\n",
    "              imagehash.whash,\n",
    "              imagehash.colorhash,\n",
    "              pdq_hash\n",
    "              ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "images = load_images('test', 500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "distorted_images = {}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/501 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:08<00:00, 58.81it/s]\n",
      "100%|██████████| 501/501 [00:06<00:00, 77.01it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_images['blur'] = ops.get_distortions(ops.gaussian_blur, [3, 7], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:02<00:00, 237.12it/s]\n",
      "100%|██████████| 501/501 [00:02<00:00, 191.54it/s]\n",
      "100%|██████████| 501/501 [00:07<00:00, 63.95it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_images['scale'] = ops.get_distortions(ops.scale, [0.25, 0.5, 1.5], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:02<00:00, 168.64it/s]\n",
      "100%|██████████| 501/501 [00:03<00:00, 162.44it/s]\n",
      "100%|██████████| 501/501 [00:03<00:00, 158.74it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_images['jpeg'] = ops.get_distortions(ops.jpeg, [10, 20, 40], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:00<00:00, 1324.72it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_images['mirror'] = ops.get_distortions(ops.flip, [0], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:00<00:00, 976.88it/s] \n"
     ]
    }
   ],
   "source": [
    "distorted_images['flip'] = ops.get_distortions(ops.flip, [1], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:01<00:00, 319.19it/s]\n",
      "100%|██████████| 501/501 [00:01<00:00, 375.78it/s]\n",
      "100%|██████████| 501/501 [00:01<00:00, 258.19it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_images['brighter'] = ops.get_distortions(ops.brighter, [0.5, 0.8, 1.5], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:04<00:00, 100.22it/s]\n",
      "100%|██████████| 501/501 [00:04<00:00, 114.31it/s]\n",
      "100%|██████████| 501/501 [00:04<00:00, 100.44it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_images['sharper'] = ops.get_distortions(ops.sharper, [0.5, 0.8, 1.5], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [],
   "source": [
    "distorted_changed_images = {}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:00<00:00, 541.48it/s]\n",
      "100%|██████████| 501/501 [00:01<00:00, 462.54it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_changed_images['rotate'] = ops.get_distortions(ops.rotate, [2, 5], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 501/501 [00:00<00:00, 3089.75it/s]\n",
      "100%|██████████| 501/501 [00:00<00:00, 3119.05it/s]\n"
     ]
    }
   ],
   "source": [
    "distorted_changed_images['crop'] = ops.get_distortions(ops.crop, [0.05, 0.1], images)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_preloaded_res(images, distortion_res):\n",
    "    res = {}\n",
    "    for hash_func in all_hashes:\n",
    "        res[hash_func.__name__] = compute_distortions_dists_preloaded(images, distortion_res=distortion_res, hash_func=hash_func)\n",
    "    return res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "0it [00:00, ?it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 552.52it/s]\n",
      "501it [00:00, 596.71it/s]\n",
      "501it [00:00, 597.26it/s]\n",
      "501it [00:00, 1175.56it/s]\n",
      "501it [00:00, 1179.27it/s]\n",
      "501it [00:00, 1185.09it/s]\n",
      "501it [00:00, 981.46it/s] \n",
      "501it [00:00, 999.65it/s] \n",
      "501it [00:00, 963.10it/s]\n",
      "501it [00:07, 70.56it/s]\n",
      "501it [00:07, 71.53it/s]\n",
      "501it [00:07, 70.56it/s]\n",
      "501it [00:05, 89.66it/s] \n",
      "501it [00:05, 94.24it/s] \n",
      "501it [00:05, 95.77it/s] \n",
      "501it [00:04, 105.91it/s]\n",
      "501it [00:04, 106.83it/s]\n",
      "501it [00:04, 107.52it/s]\n"
     ]
    }
   ],
   "source": [
    "gauss_blur_res = get_preloaded_res(images, distortion_res=distorted_images['blur'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{3: (0.0, 0.046875, 0.000499001996007984),\n",
       " 7: (0.0, 0.078125, 0.0017153193612774451)}"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gauss_blur_res['average_hash'].stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGiCAYAAAA1LsZRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAZyUlEQVR4nO3dfWyddfn48asr9BSFFmTujM12FRUVcRturNaHn5gUFsEpf5hM8EvnAAmGEKAxwhxsoo6qCC66yRygqIQwJWJUcAQapjEsIWwugXwBH5B1PrRsITudlbXY0+8f+qvWbbCzB67T7vVK7pDe3J9zrpNw2jfnvs85NSMjIyMBAJBkUvYAAMCRTYwAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKkqjpFf/epXsWDBgpg2bVrU1NTET37yk1dcs2HDhnjXu94VhUIh3vzmN8edd955AKMCABNRxTEyMDAQs2bNitWrV+/X8X/84x/j3HPPjQ9+8IOxZcuWuOqqq+KSSy6JBx98sOJhAYCJp+ZgviivpqYm7rvvvjjvvPP2ecw111wT999/fzz55JOj+z7+8Y/Hzp07Y/369Qd61wDABHHU4b6DjRs3Rnt7+5h98+fPj6uuumqfawYHB2NwcHD053K5HC+88EKceOKJUVNTc7hGBQAOoZGRkdi1a1dMmzYtJk3a98mYwx4jvb29USwWx+wrFovR398fL774YhxzzDF7rOnq6oobbrjhcI8GALwKtm3bFm94wxv2+e8Pe4wciCVLlkRnZ+foz6VSKZqbm2Pbtm3R0NCQOBkAsL/6+/ujqakpjjvuuJc97rDHyNSpU6Ovr2/Mvr6+vmhoaNjrqyIREYVCIQqFwh77GxoaxAgAjDOvdInFYf+ckba2tuju7h6z76GHHoq2trbDfdcAwDhQcYz87W9/iy1btsSWLVsi4p9v3d2yZUv09PRExD9PsXR0dIwef9lll8Wzzz4bn/3sZ+Ppp5+Ob33rW/HDH/4wrr766kPzCACAca3iGHn88cfj9NNPj9NPPz0iIjo7O+P000+PZcuWRUTEX//619EwiYh44xvfGPfff3889NBDMWvWrLj55pvj9ttvj/nz5x+ihwAAjGcH9Tkjr5b+/v5obGyMUqnkmhEAGCf29++376YBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFKJEQAglRgBAFIdUIysXr06Wlpaor6+PlpbW+Oxxx572eNXrlwZb33rW+OYY46JpqamuPrqq2P37t0HNDAAMLFUHCPr1q2Lzs7OWL58eWzevDlmzZoV8+fPj+eff36vx999991x7bXXxvLly+Opp56KO+64I9atWxef+9znDnp4AGD8qzhGbrnllvjUpz4VixcvjlNPPTXWrFkTr3nNa+I73/nOXo9/9NFH473vfW9ccMEF0dLSEmeffXacf/75r/hqCgBwZKgoRoaGhmLTpk3R3t7+7xuYNCna29tj48aNe13znve8JzZt2jQaH88++2w88MADcc455+zzfgYHB6O/v3/MBgBMTEdVcvCOHTtieHg4isXimP3FYjGefvrpva654IILYseOHfG+970vRkZG4h//+EdcdtllL3uapqurK2644YZKRgMAxqnD/m6aDRs2xI033hjf+ta3YvPmzfHjH/847r///vjiF7+4zzVLliyJUqk0um3btu1wjwkAJKnolZHJkydHbW1t9PX1jdnf19cXU6dO3eua66+/Pi688MK45JJLIiLine98ZwwMDMSll14aS5cujUmT9uyhQqEQhUKhktEAgHGqoldG6urqYs6cOdHd3T26r1wuR3d3d7S1te11zd///vc9gqO2tjYiIkZGRiqdFwCYYCp6ZSQiorOzMxYtWhRz586NefPmxcqVK2NgYCAWL14cEREdHR0xffr06OrqioiIBQsWxC233BKnn356tLa2xu9///u4/vrrY8GCBaNRAgAcuSqOkYULF8b27dtj2bJl0dvbG7Nnz47169ePXtTa09Mz5pWQ6667LmpqauK6666LP//5z/H6178+FixYECtWrDh0jwIAGLdqRsbBuZL+/v5obGyMUqkUDQ0N2eMAAPthf/9++24aACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACCVGAEAUokRACDVAcXI6tWro6WlJerr66O1tTUee+yxlz1+586dcfnll8dJJ50UhUIhTjnllHjggQcOaGAAYGI5qtIF69ati87OzlizZk20trbGypUrY/78+fHMM8/ElClT9jh+aGgozjrrrJgyZUrce++9MX369Ni6dWscf/zxh2J+AGCcqxkZGRmpZEFra2ucccYZsWrVqoiIKJfL0dTUFFdccUVce+21exy/Zs2auOmmm+Lpp5+Oo48++oCG7O/vj8bGxiiVStHQ0HBAtwEAvLr29+93RadphoaGYtOmTdHe3v7vG5g0Kdrb22Pjxo17XfPTn/402tra4vLLL49isRinnXZa3HjjjTE8PLzP+xkcHIz+/v4xGwAwMVUUIzt27Ijh4eEoFotj9heLxejt7d3rmmeffTbuvffeGB4ejgceeCCuv/76uPnmm+NLX/rSPu+nq6srGhsbR7empqZKxgQAxpHD/m6acrkcU6ZMibVr18acOXNi4cKFsXTp0lizZs0+1yxZsiRKpdLotm3btsM9JgCQpKILWCdPnhy1tbXR19c3Zn9fX19MnTp1r2tOOumkOProo6O2tnZ039vf/vbo7e2NoaGhqKur22NNoVCIQqFQyWgAwDhV0SsjdXV1MWfOnOju7h7dVy6Xo7u7O9ra2va65r3vfW/8/ve/j3K5PLrvt7/9bZx00kl7DREA4MhS8Wmazs7OuO222+J73/tePPXUU/HpT386BgYGYvHixRER0dHREUuWLBk9/tOf/nS88MILceWVV8Zvf/vbuP/+++PGG2+Myy+//NA9CgBg3Kr4c0YWLlwY27dvj2XLlkVvb2/Mnj071q9fP3pRa09PT0ya9O/GaWpqigcffDCuvvrqmDlzZkyfPj2uvPLKuOaaaw7dowAAxq2KP2ckg88ZAYDx57B8zggAwKEmRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEh1QDGyevXqaGlpifr6+mhtbY3HHntsv9bdc889UVNTE+edd96B3C0AMAFVHCPr1q2Lzs7OWL58eWzevDlmzZoV8+fPj+eff/5l1z333HPxmc98Jt7//vcf8LAAwMRTcYzccsst8alPfSoWL14cp556aqxZsyZe85rXxHe+8519rhkeHo5PfOITccMNN8TJJ5/8ivcxODgY/f39YzYAYGKqKEaGhoZi06ZN0d7e/u8bmDQp2tvbY+PGjftc94UvfCGmTJkSF1988X7dT1dXVzQ2No5uTU1NlYwJAIwjFcXIjh07Ynh4OIrF4pj9xWIxent797rm17/+ddxxxx1x22237ff9LFmyJEql0ui2bdu2SsYEAMaRow7nje/atSsuvPDCuO2222Ly5Mn7va5QKEShUDiMkwEA1aKiGJk8eXLU1tZGX1/fmP19fX0xderUPY7/wx/+EM8991wsWLBgdF+5XP7nHR91VDzzzDPxpje96UDmBgAmiIpO09TV1cWcOXOiu7t7dF+5XI7u7u5oa2vb4/i3ve1t8cQTT8SWLVtGt4985CPxwQ9+MLZs2eJaEACg8tM0nZ2dsWjRopg7d27MmzcvVq5cGQMDA7F48eKIiOjo6Ijp06dHV1dX1NfXx2mnnTZm/fHHHx8Rscd+AODIVHGMLFy4MLZv3x7Lli2L3t7emD17dqxfv370otaenp6YNMkHuwIA+6dmZGRkJHuIV9Lf3x+NjY1RKpWioaEhexwAYD/s799vL2EAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKkOKEZWr14dLS0tUV9fH62trfHYY4/t89jbbrst3v/+98cJJ5wQJ5xwQrS3t7/s8QDAkaXiGFm3bl10dnbG8uXLY/PmzTFr1qyYP39+PP/883s9fsOGDXH++efHI488Ehs3boympqY4++yz489//vNBDw8AjH81IyMjI5UsaG1tjTPOOCNWrVoVERHlcjmampriiiuuiGuvvfYV1w8PD8cJJ5wQq1atio6Ojr0eMzg4GIODg6M/9/f3R1NTU5RKpWhoaKhkXAAgSX9/fzQ2Nr7i3++KXhkZGhqKTZs2RXt7+79vYNKkaG9vj40bN+7Xbfz973+Pl156KV73utft85iurq5obGwc3ZqamioZEwAYRyqKkR07dsTw8HAUi8Ux+4vFYvT29u7XbVxzzTUxbdq0MUHz35YsWRKlUml027ZtWyVjAgDjyFGv5p19+ctfjnvuuSc2bNgQ9fX1+zyuUChEoVB4FScDALJUFCOTJ0+O2tra6OvrG7O/r68vpk6d+rJrv/a1r8WXv/zlePjhh2PmzJmVTwoATEgVnaapq6uLOXPmRHd39+i+crkc3d3d0dbWts91X/3qV+OLX/xirF+/PubOnXvg0wIAE07Fp2k6Oztj0aJFMXfu3Jg3b16sXLkyBgYGYvHixRER0dHREdOnT4+urq6IiPjKV74Sy5Yti7vvvjtaWlpGry059thj49hjjz2EDwUAGI8qjpGFCxfG9u3bY9myZdHb2xuzZ8+O9evXj17U2tPTE5Mm/fsFl1tvvTWGhobiYx/72JjbWb58eXz+858/uOkBgHGv4s8ZybC/71MGAKrHYfmcEQCAQ02MAACpxAgAkEqMAACpxAgAkEqMAACpxAgAkEqMAACpxAgAkEqMAACpKv5uGgBefbt3746enp7sMfgPzc3NUV9fnz3GhCBGAMaBnp6euPTSS7PH4D+sXbs2TjnllOwxJgQxAjAONDc3x9q1a7PHOGhbt26NFStWxNKlS2PGjBnZ4xyU5ubm7BEmDDECMA7U19dPqP8LnzFjxoR6PBwcF7ACAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKnECACQSowAAKmOyh6AQ2f37t3R09OTPQb/obm5Oerr67PHAKhqYmQC6enpiUsvvTR7DP7D2rVr45RTTskeA6CqiZEJpLm5OdauXZs9xkHbunVrrFixIpYuXRozZszIHuegNDc3Z4/Av/T19UWpVMoe44i3devWMf8kV2NjYxSLxewxxMhEUl9fP6H+L3zGjBkT6vGQp6+vLzou/J8YHHopexT+ZcWKFdkjEBGFuqPj+z+4Kz1IxAgw4ZVKpRgceikuO3VXTHvtcPY4UBX+MlAba/73uCiVSmIE4NUy7bXD0XKcGIFq4629AEAqMQIApBIjAEAqMQIApBIjAEAqMQIApBIjAEAqMQIApPKhZ//Bd1dUB99dUV2q5bsrgIlLjPxLX19f/M+FHfHS0GD2KPyL766oDkfXFeKuH3xfkACHjRj5l1KpFC8NDcaLJ38gyvWN2eNAVZi0uxTx7C+r4rsrgIlLjPyXcn1jlF87OXsMADhiuIAVAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEjlc0aAI8ZfBmqzR4CqUU3PBzECHDHW/O9x2SMAeyFGgCPGZafuimmvHc4eA6rCXwZqqybQxch/mfTizuwRoGpMtOfDtNcOR8txYgSqjRj5L8f88VfZIwDAEUWM/JcX3/j/onzM8dljQFWY9OLOCRXo1XTBHmSrpueDGPlvNTXZE0D1mCDPh8bGxijUHV0158ehWhTqjo7GxsbsMQ4sRlavXh033XRT9Pb2xqxZs+Kb3/xmzJs3b5/H/+hHP4rrr78+nnvuuXjLW94SX/nKV+Kcc8454KEPh8bGxji6rhDx7C+zR4GqcnRdoSp+WR2MYrEY3//BXVEqlbJHOeJt3bo1VqxYEUuXLo0ZM2Zkj3PEa2xsjGKxmD1G5TGybt266OzsjDVr1kRra2usXLky5s+fH88880xMmTJlj+MfffTROP/886Orqys+/OEPx9133x3nnXdebN68OU477bRD8iAOhWKxGHf94Pt+WVUBv6yqS7X8sjpYxWJxQjyOiWLGjBlxyimnZI9BlagZGRkZqWRBa2trnHHGGbFq1aqIiCiXy9HU1BRXXHFFXHvttXscv3DhwhgYGIif//zno/ve/e53x+zZs2PNmjV7vY/BwcEYHBwc/blUKkVzc3Ns27YtGhoaKhn3iLJ79+7405/+lD3GQevp6Ymvfe1r8ZnPfCaam5uzxzkob3jDG6K+vj57DCYAz+/q4/n9yvr7+6OpqSl27tz58q+wjlRgcHBwpLa2duS+++4bs7+jo2PkIx/5yF7XNDU1jXz9618fs2/ZsmUjM2fO3Of9LF++fCQibDabzWazTYBt27ZtL9sXFZ2m2bFjRwwPD+/xUmexWIynn356r2t6e3v3enxvb+8+72fJkiXR2dk5+nO5XI4XXnghTjzxxKiZIBfUsW//v6S9EgYTj+f3kWVkZCR27doV06ZNe9njqvLdNIVCIQqFwph9xx9/fM4wpGloaPDLCiYoz+8jx/5cAF/Rt/ZOnjw5amtro6+vb8z+vr6+mDp16l7XTJ06taLjAYAjS0UxUldXF3PmzInu7u7RfeVyObq7u6OtrW2va9ra2sYcHxHx0EMP7fN4AODIUvFpms7Ozli0aFHMnTs35s2bFytXroyBgYFYvHhxRER0dHTE9OnTo6urKyIirrzyyvjABz4QN998c5x77rlxzz33xOOPPx5r1649tI+ECaNQKMTy5cv3OFUHjH+e3+xNxW/tjYhYtWrV6IeezZ49O77xjW9Ea2trRESceeaZ0dLSEnfeeefo8T/60Y/iuuuuG/3Qs69+9atV96FnAECOA4oRAIBDpaJrRgAADjUxAgCkEiMAQCoxAgCkEiNUhVtvvTVmzpw5+qmMbW1t8Ytf/CJ7LOAQaGlpiZqamj22yy+/PHs0qoR301AVfvazn0VtbW285S1viZGRkfje974XN910U/zmN7+Jd7zjHdnjAQdh+/btMTw8PPrzk08+GWeddVY88sgjceaZZ+YNRtUQI1St173udXHTTTfFxRdfnD0KcAhdddVV8fOf/zx+97vf+fJTIsJpGqrQ8PBw3HPPPTEwMOBrA2CCGRoairvuuisuuugiIcKoqvzWXo5MTzzxRLS1tcXu3bvj2GOPjfvuuy9OPfXU7LGAQ+gnP/lJ7Ny5Mz75yU9mj0IVcZqGqjE0NBQ9PT1RKpXi3nvvjdtvvz1++ctfChKYQObPnx91dXXxs5/9LHsUqogYoWq1t7fHm970pvj2t7+dPQpwCGzdujVOPvnk+PGPfxwf/ehHs8ehirhmhKpVLpdjcHAwewzgEPnud78bU6ZMiXPPPTd7FKqMa0aoCkuWLIkPfehD0dzcHLt27Yq77747NmzYEA8++GD2aMAhUC6X47vf/W4sWrQojjrKnx7G8l8EVeH555+Pjo6O+Otf/xqNjY0xc+bMePDBB+Oss87KHg04BB5++OHo6emJiy66KHsUqpBrRgCAVK4ZAQBSiREAIJUYAQBSiREAIJUYAQBSiREAIJUYAQBSiREAIJUYAQBSiREAIJUYAQBS/R+/FuViMApPlAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.ylim(0, 1)\n",
    "seaborn.boxplot(gauss_blur_res['pdq_hash'].stats())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "def save_dists_excel(res, filename='res'):\n",
    "    rows = []\n",
    "    for k in res['average_hash'].stats().keys():\n",
    "        row = [k]\n",
    "        for h in all_hashes:\n",
    "            row += res[h.__name__].stats()[k]\n",
    "        rows.append(row)\n",
    "    pd.DataFrame(rows, columns=['param'] + ['min', 'max', 'avg'] * len(all_hashes)).to_excel(filename + '.xlsx', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "save_dists_excel(gauss_blur_res, 'gbr')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 609.11it/s]\n",
      "501it [00:00, 7326.82it/s]\n",
      "501it [00:00, 2204.89it/s]\n",
      "501it [00:01, 270.00it/s]\n",
      "501it [00:00, 1167.93it/s]\n",
      "501it [00:00, 11530.53it/s]\n",
      "501it [00:00, 3983.75it/s]\n",
      "501it [00:00, 547.83it/s]\n",
      "501it [00:00, 999.97it/s] \n",
      "501it [00:00, 7029.42it/s]\n",
      "501it [00:00, 2506.34it/s]\n",
      "501it [00:01, 488.98it/s]\n",
      "501it [00:06, 71.62it/s]\n",
      "501it [00:00, 969.08it/s] \n",
      "501it [00:01, 313.54it/s]\n",
      "501it [00:22, 21.87it/s]\n",
      "501it [00:05, 93.98it/s] \n",
      "501it [00:00, 1171.75it/s]\n",
      "501it [00:01, 346.72it/s]\n",
      "501it [00:12, 40.69it/s]\n",
      "501it [00:04, 103.80it/s]\n",
      "501it [00:00, 1786.59it/s]\n",
      "501it [00:01, 481.21it/s]\n",
      "501it [00:12, 39.49it/s]\n"
     ]
    }
   ],
   "source": [
    "scale_res = get_preloaded_res(images, distortion_res=distorted_images['scale'])\n",
    "save_dists_excel(scale_res, 'scale')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 688.73it/s] \n",
      "501it [00:02, 241.28it/s]\n",
      "501it [00:02, 231.84it/s]\n",
      "501it [00:02, 223.13it/s]\n",
      "501it [00:00, 982.24it/s] \n",
      "501it [00:00, 610.33it/s]\n",
      "501it [00:00, 597.98it/s]\n",
      "501it [00:00, 575.85it/s]\n",
      "501it [00:00, 537.09it/s]\n",
      "501it [00:00, 787.65it/s]\n",
      "501it [00:00, 876.46it/s]\n",
      "501it [00:00, 924.79it/s]\n",
      "501it [00:07, 71.55it/s]\n",
      "501it [00:07, 71.32it/s]\n",
      "501it [00:07, 70.20it/s]\n",
      "501it [00:07, 69.60it/s]\n",
      "501it [00:05, 92.61it/s] \n",
      "501it [00:04, 111.03it/s]\n",
      "501it [00:05, 99.93it/s] \n",
      "501it [00:05, 96.00it/s] \n",
      "501it [00:04, 102.21it/s]\n",
      "501it [00:04, 103.92it/s]\n",
      "501it [00:04, 103.54it/s]\n",
      "501it [00:04, 102.13it/s]\n"
     ]
    }
   ],
   "source": [
    "jpeg_res = get_preloaded_res(images, distortion_res=distorted_images['jpeg'])\n",
    "save_dists_excel(jpeg_res, 'jpeg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 610.06it/s]\n",
      "501it [00:00, 622.73it/s]\n",
      "501it [00:00, 1185.72it/s]\n",
      "501it [00:00, 1180.26it/s]\n",
      "501it [00:00, 991.23it/s] \n",
      "501it [00:00, 989.88it/s] \n",
      "501it [00:07, 70.16it/s]\n",
      "501it [00:07, 71.23it/s]\n",
      "501it [00:05, 96.95it/s] \n",
      "501it [00:05, 96.11it/s] \n",
      "501it [00:04, 102.83it/s]\n",
      "501it [00:04, 103.04it/s]\n"
     ]
    }
   ],
   "source": [
    "mirror_res = get_preloaded_res(images, distortion_res=distorted_images['mirror'])\n",
    "save_dists_excel(mirror_res, 'mirror')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 1149.29it/s]\n",
      "501it [00:00, 641.54it/s]\n",
      "501it [00:00, 584.74it/s]\n",
      "501it [00:00, 550.79it/s]\n",
      "501it [00:00, 583.62it/s]\n",
      "501it [00:00, 1066.98it/s]\n",
      "501it [00:00, 1183.74it/s]\n",
      "501it [00:00, 1185.25it/s]\n",
      "501it [00:00, 983.87it/s] \n",
      "501it [00:00, 984.38it/s] \n",
      "501it [00:00, 989.83it/s] \n",
      "501it [00:00, 987.62it/s] \n",
      "501it [00:07, 71.52it/s]\n",
      "501it [00:07, 70.11it/s]\n",
      "501it [00:07, 70.23it/s]\n",
      "501it [00:07, 70.98it/s]\n",
      "501it [00:05, 95.90it/s] \n",
      "501it [00:05, 99.55it/s] \n",
      "501it [00:05, 94.34it/s] \n",
      "501it [00:05, 98.66it/s] \n",
      "501it [00:05, 97.25it/s] \n",
      "501it [00:04, 101.67it/s]\n",
      "501it [00:04, 106.92it/s]\n",
      "501it [00:04, 108.94it/s]\n"
     ]
    }
   ],
   "source": [
    "brighter_res = get_preloaded_res(images, distortion_res=distorted_images['brighter'])\n",
    "save_dists_excel(brighter_res, 'brighter')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 1155.12it/s]\n",
      "501it [00:00, 714.85it/s]\n",
      "501it [00:00, 672.05it/s]\n",
      "501it [00:00, 667.10it/s]\n",
      "501it [00:00, 564.93it/s]\n",
      "501it [00:00, 853.38it/s]\n",
      "501it [00:00, 904.72it/s]\n",
      "501it [00:00, 975.73it/s]\n",
      "501it [00:00, 972.97it/s] \n",
      "501it [00:00, 917.47it/s]\n",
      "501it [00:00, 992.03it/s] \n",
      "501it [00:00, 995.79it/s] \n",
      "501it [00:07, 71.51it/s]\n",
      "501it [00:06, 71.68it/s]\n",
      "501it [00:07, 70.39it/s]\n",
      "501it [00:07, 69.84it/s]\n",
      "501it [00:05, 90.73it/s] \n",
      "501it [00:05, 94.52it/s] \n",
      "501it [00:05, 91.91it/s] \n",
      "501it [00:05, 88.93it/s] \n",
      "501it [00:04, 104.64it/s]\n",
      "501it [00:04, 102.43it/s]\n",
      "501it [00:04, 103.48it/s]\n",
      "501it [00:04, 104.11it/s]\n"
     ]
    }
   ],
   "source": [
    "sharper_res = get_preloaded_res(images, distortion_res=distorted_images['sharper'])\n",
    "save_dists_excel(sharper_res, 'sharper')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 963.94it/s]\n",
      "501it [00:00, 630.02it/s]\n",
      "501it [00:00, 1122.48it/s]\n",
      "501it [00:00, 1176.25it/s]\n",
      "501it [00:00, 992.86it/s] \n",
      "501it [00:00, 999.64it/s] \n",
      "501it [00:07, 71.34it/s]\n",
      "501it [00:06, 71.72it/s]\n",
      "501it [00:05, 95.97it/s] \n",
      "501it [00:05, 95.87it/s] \n",
      "501it [00:04, 103.84it/s]\n",
      "501it [00:04, 104.36it/s]\n"
     ]
    }
   ],
   "source": [
    "flip_res = get_preloaded_res(images, distortion_res=distorted_images['flip'])\n",
    "save_dists_excel(flip_res, 'flip')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "jpeg_res = get_preloaded_res(images, distortion_res=distorted_images['jpeg'])\n",
    "save_dists_excel(jpeg_res, 'jpeg')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 1114.89it/s]\n",
      "501it [00:00, 1229.89it/s]\n",
      "501it [00:00, 1437.09it/s]\n",
      "501it [00:00, 1149.77it/s]\n",
      "501it [00:00, 1260.98it/s]\n",
      "501it [00:00, 1474.59it/s]\n",
      "501it [00:00, 999.00it/s] \n",
      "501it [00:00, 1078.45it/s]\n",
      "501it [00:00, 1195.46it/s]\n",
      "501it [00:07, 69.58it/s]\n",
      "501it [00:06, 74.77it/s]\n",
      "501it [00:05, 88.98it/s] \n",
      "501it [00:05, 98.56it/s] \n",
      "501it [00:04, 106.67it/s]\n",
      "501it [00:04, 122.14it/s]\n",
      "501it [00:04, 108.91it/s]\n",
      "501it [00:04, 119.29it/s]\n",
      "501it [00:03, 140.34it/s]\n"
     ]
    }
   ],
   "source": [
    "rotate_res = get_preloaded_res(images, distortion_res=distorted_changed_images['rotate'])\n",
    "save_dists_excel(rotate_res, 'rotate')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "501it [00:00, 1110.48it/s]\n",
      "501it [00:00, 853.18it/s] \n",
      "501it [00:00, 929.73it/s] \n",
      "501it [00:00, 975.24it/s] \n",
      "501it [00:00, 1414.89it/s]\n",
      "501it [00:00, 1774.14it/s]\n",
      "501it [00:00, 998.91it/s] \n",
      "501it [00:00, 1179.04it/s]\n",
      "501it [00:00, 1419.63it/s]\n",
      "501it [00:06, 71.94it/s]\n",
      "501it [00:05, 85.84it/s] \n",
      "501it [00:04, 100.48it/s]\n",
      "501it [00:05, 97.25it/s] \n",
      "501it [00:04, 119.47it/s]\n",
      "501it [00:03, 147.42it/s]\n",
      "501it [00:04, 108.66it/s]\n",
      "501it [00:03, 133.40it/s]\n",
      "501it [00:02, 169.75it/s]\n"
     ]
    }
   ],
   "source": [
    "crop_res = get_preloaded_res(images, distortion_res=distorted_changed_images['crop'])\n",
    "save_dists_excel(crop_res, 'crop')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_res(distortion_funcs, limit: int | None = None, dataset_path: str = 'test'):\n",
    "    res: dict[str, S] = {}\n",
    "    for hash_func in all_hashes:\n",
    "        res[hash_func.__name__] = compute_distortions_dists(images,\n",
    "                                                            distortion_funcs=distortion_funcs,\n",
    "                                                            hash_func=hash_func,\n",
    "                                                            limit=limit)\n",
    "    return res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 248,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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6urqhtzn7W9/ezzxxBPR398/sO6vf/1rnH766UOGCABQWop+maahoSHWr18fP/zhD+Mvf/lLXH755dHd3T3w7prFixfHihUrBra//PLLY8+ePXHllVfGX//619i8eXPcdNNNccUVVxy5nwIAOGYV/dbehQsXxvPPPx+rVq2K9vb2mDVrVmzZsmXgota2trYYM+bFxqmpqYn7778/rrrqqpgxY0ZMmzYtrrzyyrj66quP3E8BAByzhnUH1uXLl8fy5cuH/LOWlpZD1tXV1cXDDz88nEMBAMc5H5QHAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQamz0AAPzXgQMHorW1NXuMUaO2tjaqqqqyxzjqxAgAo0Zra2ssW7Yse4xRY/369XH22Wdnj3HUiREARo3a2tpYv3596gytra1x4403xsqVK6O2tjZ1luzjjxQxAsCoUVVVNWqeCaitrR01sxzvXMAKAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKRyn5ER4hbHg5XKLY4BeHliZIS4xfFgpXKLYwBenhgZIW5xPFj28QEYPcTICHGLYwAYmgtYAYBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUYgQASCVGAIBUw4qRdevWxfTp06OqqirmzZsXjzzyyCva75577omysrK45JJLhnNYAOA4VHSMbNq0KRoaGmL16tWxffv2mDlzZsyfPz+ee+65l9xv586d8fnPfz7e+c53DntYAOD4U3SMrFmzJpYtWxZLly6Nc889N5qamuKkk06KDRs2HHafvr6+uOyyy+L666+PM88882WP0dPTE11dXYMWAOD4VFSM9Pb2xrZt26K+vv7FbzBmTNTX18fWrVsPu99XvvKVmDx5cnzyk598RcdpbGyMCRMmDCw1NTXFjAkAHEOKipHdu3dHX19fVFdXD1pfXV0d7e3tQ+7zu9/9Lu68885Yv379Kz7OihUrorOzc2DZtWtXMWMCAMeQsUfzm+/bty8+/vGPx/r162PSpEmveL/KysqorKw8ipMBAKNFUTEyadKkKC8vj46OjkHrOzo6YsqUKYds/+STT8bOnTtjwYIFA+v6+/sPHnjs2Hj88cfjrLPOGs7cAMBxoqiXaSoqKmL27NnR3Nw8sK6/vz+am5ujrq7ukO3POeec+NOf/hQ7duwYWD74wQ/Ge97zntixY4drQQCA4l+maWhoiCVLlsScOXNi7ty5sXbt2uju7o6lS5dGRMTixYtj2rRp0djYGFVVVXH++ecP2n/ixIkREYesBwBKU9ExsnDhwnj++edj1apV0d7eHrNmzYotW7YMXNTa1tYWY8a4sSsA8MoM6wLW5cuXx/Lly4f8s5aWlpfc96677hrOIQGA45SnMACAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGIEAEglRgCAVGOzB4BS1tHREXv37s0eI1Vra+ug/5ayiRMnRnV1dfYYMOLECCTp6OiIj112WfT09maPMirceOON2SOkq6yoiB/dfbcgoeSIEUiyd+/e6OntjcvP646pr+nLHodkz3SXx+1/PnheiBFKjRiBZFNf0xevHy9GgNLlAlYAIJUYAQBSiREAIJUYAQBSiREAIJUYAQBSiREAIJUYAQBSiREAIJUYAQBSuR08AAN8krRPkv7/jdQnSYsRACLiYIhc9rHLorfHJ0lH+CTpiIiKyoq4+0dH/5OkxQgAEXHwE4N7e3qjf25/FMYXsschWVlXWfQ+0jsinyQtRgAYpDC+EHFK9hRkK8TIBakLWAGAVGIEAEglRgCAVCVzzYi3q3m72v82Um9ZA+CllUSMdHR0xGWXfSx6e3uyRxkVvF3toIqKyrj77h8JEoBkJREje/fujd7enjhw1rujcOLE7HEYBcr+vTfiyZYRecsaAC+tJGLkvwonToz+10zKHoNRwMVSAKOH38kAQCoxAgCkEiMAQCoxAgCkEiMAQCoxAgCkEiMAQCoxAgCkEiMAQCoxAgCkEiMAQCoxAgCkEiMAQCoxAgCkEiMAQKphxci6deti+vTpUVVVFfPmzYtHHnnksNuuX78+3vnOd8Ypp5wSp5xyStTX17/k9gBAaSk6RjZt2hQNDQ2xevXq2L59e8ycOTPmz58fzz333JDbt7S0xKJFi+LXv/51bN26NWpqauK9731vPP300696eADg2Fd0jKxZsyaWLVsWS5cujXPPPTeampripJNOig0bNgy5/d133x2f/exnY9asWXHOOefEHXfcEf39/dHc3HzYY/T09ERXV9egBQA4PhUVI729vbFt27aor69/8RuMGRP19fWxdevWV/Q9/vWvf8V//vOfeO1rX3vYbRobG2PChAkDS01NTTFjAgDHkKJiZPfu3dHX1xfV1dWD1ldXV0d7e/sr+h5XX311TJ06dVDQ/G8rVqyIzs7OgWXXrl3FjAkAHEPGjuTBbr755rjnnnuipaUlqqqqDrtdZWVlVFZWjuBkAECWomJk0qRJUV5eHh0dHYPWd3R0xJQpU15y329+85tx8803x4MPPhgzZswoflIA4LhU1Ms0FRUVMXv27EEXn/73YtS6urrD7vf1r389brjhhtiyZUvMmTNn+NMCAMedol+maWhoiCVLlsScOXNi7ty5sXbt2uju7o6lS5dGRMTixYtj2rRp0djYGBERX/va12LVqlWxcePGmD59+sC1JePGjYtx48YdwR8FADgWFR0jCxcujOeffz5WrVoV7e3tMWvWrNiyZcvARa1tbW0xZsyLT7jcfvvt0dvbGx/+8IcHfZ/Vq1fHl7/85Vc3PQBwzBvWBazLly+P5cuXD/lnLS0tg77euXPncA4BAJQIn00DAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAKjECAKQSIwBAqpKIkT179mSPwCjl3ADIVxIxsm/fvuwRGKWcGwD5SiJGAIDRS4wAAKnECACQSowAAKnECCTxTh6GknleOCcZykicF2IEkngnD0PJPC+ckwxlJM4LMQIApBqbPQCUume6/T8Bo+w86MoegFFhBM8DMQLJbv/zuOwRYJDyR8qzR6DE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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.ylim(0, 1)\n",
    "seaborn.boxplot(gauss_blur_res['phash'].stats())\n",
    "seaborn.boxplot(gauss_blur_res['whash'].stats())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "average_hash 0.453 0.455 0.136\n",
      "dhash 0.484 0.486 0.087\n",
      "phash 0.5 0.484 0.071\n",
      "whash 0.469 0.459 0.135\n",
      "colorhash 0.143 0.147 0.056\n",
      "pdq_hash 0.5 0.498 0.039\n"
     ]
    }
   ],
   "source": [
    "for h in all_hashes:\n",
    "    dists = compute_random_dists(gauss_blur_res[h.__name__].orig_hashes, num=500)\n",
    "    mu, std = norm.fit(dists) \n",
    "    print(h.__name__, round(np.median(dists), 3), round(mu, 3), round(std, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hist_with_normal(random_dists: np.ndarray, bins=30, hash_name: str | None = None):\n",
    "    h = np.sort(random_dists)\n",
    "\n",
    "    if hash_name:\n",
    "        plt.title(f'{hash_name} random dist')\n",
    "    plt.xlim(0, 1)\n",
    "    plt.hist(random_dists, bins=bins, density=True)\n",
    "    x = np.linspace(0, 1, 1000)\n",
    "    plt.plot(h, stats.norm.pdf(x, np.mean(x), np.std(x)))\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fit Values: 0.50 and 0.04\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGzCAYAAAABsTylAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4oUlEQVR4nO3deXgW9b3//9d9Z7kTIAl7FolsrgXcADmAHjdOKaUip1erLRxLtXYD68K3raBVFqugx1pai9p6qtLfUdFjK/YIhSrqoVpXEEsFQWQLS8IWkrBluz+/Pyb3BgkkYe575p55Pq4rl597MrnnHUaSF59tAsYYIwAAABcKOl0AAABASwgqAADAtQgqAADAtQgqAADAtQgqAADAtQgqAADAtQgqAADAtQgqAADAtQgqAADAtQgqAJoVCAQ0c+bMpLz3t7/9bXXq1Ckp792SN998U4FAQC+++GJKrwvg1BBUAACAaxFUAACAaxFUAACAaxFUAI+aOXOmAoGAPv30U1177bXKz89Xt27ddOutt+ro0aPR82pra3X77berR48eysvL07hx47R9+/Zm3/Ott97S0KFDlZOTo/79++u3v/1t9DrtsWPHDo0fP16dOnVSjx499OMf/1iNjY0J5zz00EMaMWKEunXrptzcXA0ePLjZeSavvvqqLrnkEnXu3FmdOnXS2WefrTvvvPO488LhsO677z716tVLOTk5uuqqq7Rx48Z21Q8g+TKdLgBAcl177bXq06eP5syZo3fffVe//vWvVVlZqT/84Q+SpJtuukn//d//rQkTJmjEiBF6/fXXNXbs2OPeZ82aNfriF7+oHj16aObMmWpoaNCMGTNUWFjYrroaGxs1evRoDRs2TA899JBee+01/eIXv1D//v31wx/+MHrer371K40bN04TJ05UXV2dFi5cqK9//et65ZVXonV+8skn+spXvqLzzjtPs2fPVigU0saNG/X2228fd925c+cqGAzqxz/+saqqqvTggw9q4sSJeu+999r1fQBIMgPAk2bMmGEkmXHjxiUcnzx5spFkPv74Y7N69WojyUyePDnhnAkTJhhJZsaMGdFj48ePNzk5OWbr1q3RY2vXrjUZGRmmrT9KJk2aZCSZ2bNnJxy/8MILzeDBgxOOHT58OOF1XV2dGThwoLnyyiujx375y18aSWbPnj0tXvONN94wksy5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xsZUle1J7bkXI0aM0MqVK6PDQ5s2bdKSJUv05S9/OSU1I8au399J2UK/JXv37lVjY+NxW+kXFhbq008/bfZrysvLmz2/vLw8aXX6QXvuxbHuuOMOlZSUHPc/ItquPffjrbfe0u9//3utXr06BRX6R3vuxaZNm/T6669r4sSJWrJkiTZu3KjJkyervr5eM2bMSEXZntSeezFhwgTt3btXl1xyiYwxamho0A9+8APdeeedqSgZcVr6/V1dXa0jR44oNze3Ve/Dqh+0y9y5c7Vw4UK99NJLysnJcboc36mpqdH111+vJ554Qt27d3e6HN8Lh8Pq2bOnfve732nw4MG67rrrdNddd+nxxx93ujTfefPNN3X//ffr0Ucf1apVq/SnP/1Jixcv1r333ut0aWinlPaodO/eXRkZGaqoqEg4XlFRoaKioma/pqioqE3no3Xacy8iHnroIc2dO1evvfaazjvvvGSW6RttvR+ff/65tmzZoquvvjp6LBwOS5IyMzO1fv169e/fP7lFe1R7/m4UFxcrKytLGRkZ0WPnnnuuysvLVVdXp+zs7KTW7FXtuRd33323rr/+et10002SpEGDBunQoUP63ve+p7vuukvBIP8+T5WWfn/n5+e3ujdFSnGPSnZ2tgYPHqzly5dHj4XDYS1fvlzDhw9v9muGDx+ecL4kvfrqqy2ej9Zpz72QpAcffFD33nuvli5dqiFDhqSiVF9o6/0455xztGbNGq1evTr6MW7cOF1xxRVavXq1SktLU1m+p7Tn78bIkSO1cePGaFiUpA0bNqi4uJiQcgracy8OHz58XBiJBEjDM3hTyrbf322b53vqFi5caEKhkHn66afN2rVrzfe+9z3TuXNnU15ebowx5vrrrzfTpk2Lnv/222+bzMxM89BDD5l169aZGTNmsDzZJm29F3PnzjXZ2dnmxRdfNLt27Yp+1NTUOPUteEpb78exWPVjn7bei23btpm8vDxz8803m/Xr15tXXnnF9OzZ0/z85z936lvwjLbeixkzZpi8vDzz3HPPmU2bNpm//vWvpn///ubaa6916lvwjJqaGvPRRx+Zjz76yEgyDz/8sPnoo4/M1q1bjTHGTJs2zVx//fXR8yPLk3/yk5+YdevWmfnz56fH8mRjjHnkkUfM6aefbrKzs83FF19s3n333ejnLrvsMjNp0qSE81944QVz1llnmezsbDNgwACzePHiFFfsXW25F7179zaSjvuYMWNG6gv3qLb+3YhHULFXW+/F3//+dzNs2DATCoVMv379zH333WcaGhpSXLU3teVe1NfXm5kzZ5r+/fubnJwcU1paaiZPnmwqKytTX7jHvPHGG83+Doj8+U+aNMlcdtllx33NBRdcYLKzs02/fv3MU0891ebrBoyhLwwAALgTs4oAAIBrEVQAAIBrEVQAAIBrEVQAAIBrEVQAAIBrEVQAAIBrEVQAAIBrEVQAAIBrEVQAAIBrEVQAAIBrEVQAAIBr/f9imsICZg+11gAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from scipy.stats import norm\n",
    " \n",
    "data = compute_random_dists(gauss_blur_res['pdq_hash'].orig_hashes, num=500)\n",
    "mu, std = norm.fit(data) \n",
    " \n",
    "plt.hist(data, bins=40, density=True,)\n",
    " \n",
    "xmin, xmax = plt.xlim()\n",
    "x = np.linspace(xmin, xmax, 100)\n",
    "p = norm.pdf(x, mu, std)\n",
    " \n",
    "plt.xlim(0, 1)\n",
    "plt.plot(x, p, linewidth=2)\n",
    "print(\"Fit Values: {:.2f} and {:.2f}\".format(mu, std))\n",
    "plt.title('pdq_hash')\n",
    " \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'bright 0.1)'}>"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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SBDgPPni214Oh0NpaWkaP3687Ha7V/uS+LYXAAAAcC44NwAAAPAdRoIAPhIWFuazb0bZ7Xa+hQUAAAD4Kc4NAAAA/E+w2QUAAAAAAAAAAAB4AyEIAAAAAAAAAAAISIQgAAAAAAAAAAAgIDEnCAAAVYDL5VJWVpYKCgoUHR2thIQEWSwWs8sCAAAAAADwa4QgAAD4udWrVys9PV15eXnuZTExMRo5cqSSkpJMrAwAAAAAAMC/cTksAAD82OrVq5WamqrGjRtr5syZWrZsmWbOnKnGjRsrNTVVq1evNrtEAAAAAAAAv0UIAgCAn3K5XEpPT1diYqImTZqkVq1aKTw8XK1atdKkSZOUmJioWbNmyeVymV0qAAAAAACAXyIEAQDAT2VlZSkvL08DBw5UcLDnS3ZwcLAGDBig3377TVlZWSZVCAAAAAAA4N8IQQAA8FMFBQWSpPj4+HLXly4vbQcAAAAAAABP5xSCzJw5U40aNVJYWJg6d+6s77777rTtp0+frubNmys8PFwNGzbUgw8+qCNHjpxTwQAAXCiio6MlSTk5OeWuL11e2g4AAAAAAACeKhyCLFy4UKNHj9bEiRP1/fffq23btrrhhhv0+++/l9t+/vz5evTRRzVx4kRt2bJFr7/+uhYuXKh//etf5108AACBLCEhQTExMZo3b55KSko81pWUlGj+/PmKjY1VQkKCSRUCAAAAAAD4twqHINOmTdOdd96pYcOGqVWrVpo1a5Zq1KihN954o9z2X3/9tbp06aIBAwaoUaNGuv7663XbbbedcfQIAAAXOovFopEjRyozM1MpKSnavHmzDh06pM2bNyslJUWZmZm6++67ZbFYzC4VAAAAAADAL1UoBCkuLtb69evVvXv3Px8gOFjdu3dXZmZmufe58sortX79enfosX37di1btkw9evQ4ZT9FRUUqLCz0+AcAwIUoKSlJqamp2r59u5KTk9WzZ08lJycrJydHqampSkpKMrtEAAAAAAAAv1WtIo337Nkjl8slm83msdxmsyk7O7vc+wwYMEB79uzRVVddJcMwdOzYMd19992nvRzWU089pccff7wipQEAELCSkpLUpUsXZWVlqaCgQNHR0UpISGAECAAAAAAAwBmc08ToFbFq1So9+eSTevnll/X999/r/fff10cffaRJkyad8j7jxo2T0+l0//vf//7n7TIB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OvHcwhtOfg+K0/P25wuVdX7ui+3q7X2zKqvMYzaf2fgnbx0LKvv1+EL6vJgQBAAAAAAAAAAABCRCEC9yuVwqKSkxu4wLQnFxsdklVLpAfE5AIOFvFADHAeDCxjEAZjIMQ8eOHTO7jIAU6H/bgf78gMrC30pguaBCkOXLl+uqq65S7dq1FR0drb/97W/65ZdfJElXXnmlxo4d69F+9+7dql69ulavXi1JKioq0pgxYxQXF6eaNWuqc+fOWrVqlbt96ZCkpUuXqlWrVgoNDZXD4dDatWt13XXXqW7durJareratau+//57j76ys7N11VVXKSwsTK1atdKKFSsUFBSkJUuWuNv873//U//+/VW7dm1FRUXppptu0o4dOyr0O3juuecUGxur6Oho3XPPPTp69Kh73Zw5c9ShQwdFREQoJiZGAwYM0O+//+5ev2/fPg0cOFD16tVTeHi4mjZtqjfffNPj8bdv365rr71WNWrUUNu2bZWZmVmh+s7WNddco+TkZD3wwAOqW7eubrjhBvdwzpUrV6pDhw6qUaOGrrzySm3dutXjvk8//bRsNpsiIiI0fPhwHTly5LR9uVwuDR8+XPHx8QoPD1fz5s31wgsvuNd/+umnCgsLKzOM9P7779df/vIX9+2vvvpKV199tcLDw9WwYUPdd999OnjwoHt9o0aNNGnSJA0ZMkSRkZG66667JEljx45Vs2bNVKNGDTVu3FgpKSke202SJk+erPr16ysiIkJ33HGHHn300TLD7l577TW1bNlSYWFhatGihV5++eUz/p5PdLptW1BQoNtuu01xcXGqUaOGEhIS9M4773jcf9GiRUpISFB4eLiio6PVvXt3j+cvnX7/rKoOHjyoIUOGqFatWoqNjdXUqVPLtDl06JBuv/12RUREyG6365VXXvFYf6Z94IcfftC1116riIgIRUZGqn379lq3bp3HY3zyySdq2bKlatWqpRtvvFG//fabd55wAPPlcUeSli1bpmbNmik8PFzXXnvtKY/3p9u2Z3r9MQxDqampstvtCg0NVYMGDXTfffd5PP6Z9k+cWem+k5ycLKvVqrp16yolJUWGYbjbcByoGnx5HCh93I8++kht2rRRWFiYrrjiCv33v/8t05bjgH/797//rdq1a8vlckmSNm7cqKCgID366KPuNnfccYcGDRrkvs029U++PAZ06NBBzz33nPt2nz59VL16dR04cECStHPnTgUFBennn392t+G1xPdKSkr07LPP6pJLLlFoaKjsdrvS0tIkSVlZWfrLX/7iPv+566673NuvPEVFRbrvvvtUv359hYWF6aqrrtLatWvd60v3tY8//ljt27dXaGiovvrqK3cdjzzyiKKiohQTE6PU1FSPx542bZoSEhJUs2ZNNWzYUKNGjfKo5ddff1WvXr1Up04d1axZU5deeqmWLVvm8Rjr168/7T5elfn6ff7mzZv1t7/9TZGRkYqIiNDVV1/t/myqpKRETzzxhC666CKFhoaqXbt2Wr58+Wkf74svvlCnTp0UGhqq2NhYPfroox4BWXnPr9Tptusvv/yim266STabTbVq1VLHjh21YsUKj75ffvllNW3aVGFhYbLZbOrXr5/H+jPtm4HgTO/1f//9d/Xq1Uvh4eGKj4/XvHnzyjzGtm3blJSU5P5M8LPPPivzmeCZ8JnN+fPH9/pvvfWW7Ha7atSoob///e8qKCgo81gn913eZ4JnEiifF5+WcQFZtGiRsXjxYmPbtm3Ghg0bjF69ehkJCQmGy+UyXnrpJcNutxslJSXu9jNmzPBYdscddxhXXnmlsXr1auPnn382pkyZYoSGhho//fSTYRiG8eabbxrVq1c3rrzySmPNmjVGdna2cfDgQWPlypXGnDlzjC1bthg//vijMXz4cMNmsxmFhYWGYRjGsWPHjObNmxvXXXedsXHjRuPLL780OnXqZEgyPvjgA8MwDKO4uNho2bKlcfvttxubNm0yfvzxR2PAgAFG8+bNjaKiojM+96FDhxqRkZHG3XffbWzZssX48MMPjRo1ahivvPKKu83rr79uLFu2zPjll1+MzMxMIzEx0fjrX//qXn/PPfcY7dq1M9auXWvk5OQYn332mbF06VLDMAwjJyfHkGS0aNHC+Pe//21s3brV6Nevn3HxxRcbR48ePb8NV46uXbsatWrVMh5++GEjOzvbyM7ONj7//HNDktG5c2dj1apVxubNm42rr77auPLKK933W7hwoREaGmq89tprRnZ2tjF+/HgjIiLCaNu27Sn7Ki4uNh577DFj7dq1xvbt2425c+caNWrUMBYuXGgYxvHtZ7PZjNdee819n5OX/fzzz0bNmjWN559/3vjpp5+MNWvWGJdddpnxz3/+032fiy++2IiMjDSee+45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E7MXFBTo6aef1tVXX60WLVqUm8jVq1dPQ4cO1dy5czV9+vQqN4liy5Yt3eFXqTMFAWvWrNGVV16pUaNG6bLLLtMll1xS7giKgQMHat68efrwww8VHBysnj17utddfvnl+vHHH8tsu0suuUQhISGn7Pvrr7/WxRdfrPHjx6tDhw5q2rSpfv31V482zZs3L7O/nHjbZrOpQYMG2r59e5m+4+PjT/vcz9aaNWt00003adCgQWrbtq0aN26sn376yaNNUFCQunTposcff1wbNmxQSEiIx0lVIGrSpImqV6/usc/t27evzO/mdM5mH5CkZs2a6cEHH9Snn36qm2++ucwkVDDPuRx3WrZsqe+++65C9ynPmV5/pOMnYr169dKLL76oVatWKTMzU1lZWRXuC6dX3j7QtGlTj2/cnArHgarvXI4D5bUrfQ1p2bLlWffNccA/lH6r//nnn3d/cF0agqxatarMN/pPh21a9ZzrMaBr1676/PPPtXr1al1zzTWKiopSy5YtlZaWptjYWDVr1uysa+C1pPI1bdpU4eHhWrlyZZl1LVu21A8//OAxqfCaNWsUHBxcZlS4dPy8ISQkRGvWrHEvO3r0qNauXatWrVqdV53r169XSUmJpk6dqiuuuELNmjVzX8HgRA0bNtTdd9+t999/Xw899JBeffXV8+r3QnAuf9tt2rTRl19+We6E0pGRkWrQoIHHfiAd33dOtR+0bNlSmZmZHoHkmjVrFBERoYsuuuhsn0q51qxZo3/+85/6+9//roSEBMXExGjHjh0ebapVq6bu3bvr2Wef1aZNm7Rjxw795z//Oa9+q6JTvddv0aKFjh07pvXr17vXbd261SMoatmypf73v//pt99+87h/ZeIzG+/y1nv9s3nc8+n7bATS58XVzC7AV+rUqaPo6Gi98sorio2NlcPh0KOPPurRpmbNmurTp49SUlK0ZcsW3Xbbbe51zZo108CBAzVkyBBNnTpVl112mXbv3q2VK1eqTZs2Hh94n6xp06aaM2eOOnTooMLCQj388MMe6f91112nJk2aaOjQoXr22We1f/9+TZgwQdKf6djAgQM1ZcoU3XTTTXriiSd00UUX6ddff9X777+vRx555Lxf3Ox2u0JCQjRjxgzdfffd+u9//6tJkyZ5tHnsscfUvn17XXrppSoqKtK///3vCp2E+4P7779f//znP9WhQwd16dJF8+bN0+bNm9W4ceNT3qdp06aaPXu2PvnkE8XHx2vOnDlau3ZtmQBh4MCBSk1NVVpamvr166fQ0FD3urFjx+qKK65QcnKy7rjjDtWsWVM//vijPvvsM7300kun7dvhcGjBggXq2LGjPvroozIvQvfee6/uvPNOdejQQVdeeaUWLlyoTZs2eTynxx9/XPfdd5+sVqtuvPFGFRUVad26ddq3b59Gjx5d0V9juXUuWrRIX3/9terUqaNp06YpPz/f/Ubt22+/1cqVK3X99derfv36+vbbb7V79+4qt/9UVK1atTR8+HA9/PDDio6OVv369TV+/HgFB599/nymfeDw4cN6+OGH1a9fP8XHx2vnzp1au3at+vbt642nhHNwLsedu+++W1OnTtXDDz+sO+64Q+vXr9dbb71V4b7P9Prz1ltvyeVyqXPnzqpRo4bmzp2r8PBwXXzxxefyVHEaDodDo0eP1ogRI/T9999rxowZmjp16lndl+NA1Xcux4FSTzzxhKKjo2Wz2TR+/HjVrVtXffr0Oeu+OQ74hzp16qhNmzaaN2+e+71fUlKS+vfvr6NHj5b5Rv/psE2rnnM9BlxzzTWaMWOG6tWrpxYtWriXvfTSS7rlllsqVAOvJZUvLCxMY8eO1SOPPKKQkBB16dJFu3fv1ubNmzVw4EBNnDhRQ4cOVWpqqnbv3q17771XgwcPls1mK/NYNWvW1MiRI/Xwww8rKipKdrtdzz77rA4dOqThw4efV52XXHKJjh49qhkzZqhXr15as2aNZs2a5dHmgQce0F//+lc1a9ZM+/bt0+effx7w52qV4Vz+tpOTkzVjxgz94x//0Lhx42S1WvXNN9+oU6dOat68uR5++GFNnDhRTZo0Ubt27fTmm29q48aN7ku3n2zUqFGaPn267r33XiUnJ2vr1q2aOHGiRo8eXaHzzvI0bdpU77//vnr16qWgoCClpKR4fHP73//+t7Zv366kpCTVqVNHy5YtU0lJSblBX6A71Xv95s2b68Ybb9SIESOUnp6uatWq6YEHHvB43e7evbuaNWumoUOHasqUKSosLNT48eMrtT4+s/Eub73Xv++++9SlSxc999xzuummm/TJJ59o+fLlldb32Qikz4svmJEgwcHBWrBggdavX6/WrVvrwQcf1JQpU8q0GzhwoH744QddffXVstvtHuvefPNNDRkyRA899JCaN2+uPn36aO3atWXanez111/Xvn37dPnll2vw4MG67777VL9+ffd6i8WiJUuW6MCBA+rYsaPuuOMO9wEvLCxM0vHrr65evVp2u919DeHhw4fryJEjioyMPN9fj+rVq6e33npL7733nlq1aqWnn35azz33nEebkJAQjRs3Tm3atFFSUpIsFosWLFhw3n370q233qqUlBQ98sgjat++vX799VeNHDnytPcZMWKEbr75Zt16663q3LmzCgoKNGrUqDLtLrnkEnXq1EmbNm3yGEUkHf+2xxdffKGffvpJV199tS677DI99thjHtd8LE/v3r314IMPKjk5We3atdPXX3+tlJQUjzYDBw7UuHHjNGbMGF1++eXKyfn/7d3Pa5NJHMfxT8zJUkpjL8GAN4NR61MSKsWkTdRIjJBLFXsyFJRSCBhorlH0YBoRi14kECGCSE4x0UCwtYi0eOnJP+CBvZaC8aDoqd09LBs3rq1t02x+9P2CnJ5MZkIm8wzf7zMzf2hycrLWd6S/lzc/ffpUuVxOg4OD8vv9evbs2Z6tBEkmk3K73QqFQgoEArLb7XUBmr6+Pi0tLenSpUtyOp1KJpN6+PChwuHwntTfzh48eKDR0VFFIhEFg0H5fL5N95j8ld/1AavVqk+fPikajcrpdOrq1asKh8O6e/duM74OdmE3486RI0dUKBRUKpVkGIYymYxSqdSO6/7d/ae/v1/ZbFZer1enTp3S4uKiyuWyBgYGdlwXthaNRvX9+3edPn1asVhM8XhcU1NT2yrLOND5djMO/COdTisej8vj8Wh1dVXlcnnLVaQ/YxxoH36/X+vr67VVH4cOHdLx48dlt9t3FDDiN+08ux0DRkdHtbGxUZckCwQCdf1ou7iXNMetW7eUSCR0+/ZtuVwuTUxMaG1tTT09PZqfn1e1WtXw8LCuXLmi8+fPb/kAXDqd1uXLl3Xt2jW53W6Zpqn5+XnZbLaG2mgYhubm5nT//n2dPHlSL1680OzsbN171tfXFYvF5HK5dPHiRTmdTj158qSheveD3fy3BwYG9O7dO339+lV+v18ej0fZbLa2VczNmzc1MzOjRCKhwcFBvXnzRq9fv66dG/Uzh8OhSqWilZUVGYah6elpXb9+vfZgbSPm5uZks9l05swZRSIRhUIhud3u2vX+/n69fPlS586dk8vlUiaTUT6f14kTJxquu9NsNdfP5XI6fPiw/H6/xsfHNTU1VXffPnDggIrFYq38jRs3dO/evT1tHzGb5mrWXH9kZETZbFaPHz+WYRhaWFj4z3+7kbq3o5vixZY/9/Mmnm3sw4cP8vl8Mk2z7swIYDsuXLggu92u58+ft7opALDvBQIBDQ0N6dGjR61uCjrI+/fvdfbsWX3+/Lnu8EwAAAC0j2bN9S0Wi4rF4o5WAKNzNHOuf+fOHZVKJX38+HFPP7fT7ZvtsNpdsVhUb2+vjh49KtM0FY/H5fV6SYDgt759+6ZMJqNQKCSr1ap8Pq/FxUW9ffu21U0DAAAAAAAAgJbaN9thtbsvX74oFovp2LFjmpyc1PDwsF69erXt8r29vZu+lpeXm9hytJrFYlGlUtHY2Jg8Ho/K5bIKhYKCweC2yqdSqU37DksfAQAAAAAAWoOYDRpBvPgHtsPqEqZpbnrN4XDUHboE/Fu1WlW1Wv3ltYMHD8rhcPzPLQIAAAAAAAAxGzSCePEPJEEAAAAAAAAAAEBXYjssAAAAAAAAAADQlUiCAAAAAAAAAACArkQSBAAAAAAAAAAAdCWSIAAAAAAAAAAAoCuRBAEAAAAAAAAAAF2JJAgAAAAAAAAAAOhKJEEAAAAAAAAAAEBXIgkCAAAAAAAAAAC60l+bXfKQLp4EvAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 2000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "PARAM = 0.1\n",
    "res = crop_res\n",
    "plt.figure(figsize=(20, 5))\n",
    "plt.title(f'bright {PARAM})')\n",
    "q = {}\n",
    "for h in all_hashes:\n",
    "    q[h.__name__] = res[h.__name__].stats()[PARAM]\n",
    "    q[f'rnd {h.__name__}'] = compute_random_dists(res[h.__name__].orig_hashes)\n",
    "seaborn.boxplot(q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 265,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: (0.1953125, 0.546875, 0.49700598802395207)}"
      ]
     },
     "execution_count": 265,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mirror_res['pdq_hash'].stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "T=0.02: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.04: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.06: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.08: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.1: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.12: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.14: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.16: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.18: precision=1.0, recall=0.5, f1=0.6666666666666681\n",
      "T=0.2: precision=1.0, recall=0.501, f1=0.6673333333333348\n"
     ]
    }
   ],
   "source": [
    "search_metrics.train_T(hash_name='pdq_hash',\n",
    "                       res=mirror_res,\n",
    "                       train_size=500,\n",
    "                       from_t=0.02,\n",
    "                       to_t=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 291,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "T=0.2: precision=1.0, recall=0.42533333333333445, f1=0.5827999999999998\n",
      "T=0.222222: precision=0.9981666666666666, recall=0.46100000000000346, f1=0.6144666666666647\n",
      "T=0.244444: precision=0.9981666666666666, recall=0.4863333333333383, f1=0.6369666666666636\n",
      "T=0.266667: precision=0.9981666666666666, recall=0.5103333333333397, f1=0.6582666666666623\n",
      "T=0.288889: precision=0.9974999999999998, recall=0.5246666666666727, f1=0.6699714285714239\n",
      "T=0.311111: precision=0.9936, recall=0.5486666666666716, f1=0.6893357142857086\n",
      "T=0.333333: precision=0.9856499999999996, recall=0.5793333333333364, f1=0.7123999999999937\n",
      "T=0.355556: precision=0.9765999999999996, recall=0.6173333333333336, f1=0.7395753968253903\n",
      "T=0.377778: precision=0.8809535714285697, recall=0.661999999999998, f1=0.7336884559884517\n",
      "T=0.4: precision=0.5133051212676216, recall=0.7089999999999976, f1=0.5678308685122935\n"
     ]
    }
   ],
   "source": [
    "search_metrics.train_T_all_res(hash_name='pdq_hash',\n",
    "                               res_list=[crop_res, rotate_res],\n",
    "                               train_size=500,\n",
    "                               from_t=0.2,\n",
    "                               to_t=0.4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## песочница"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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aWlRYmJwxmlqatIf//hH/f73vw9P1QAAxIDzL810+uu//mu9/PLLfVxN9OJx8AAAhNm580G6m6h6sfX9RUQfBw8AAHr25JNPBv7+zjvvBK079/O5/eIZb+0FACDMpkyZEvh757O1urs0c26/eMbICAAAEXD+5Zfzg0h/vjwTKsIIAAARsnfv3i6XYp588kmCyHm4TAMAQARNmTKF8HERjIwAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwChu7QUAxLUzZ86oubnZdBlhk5mZKZvNZrqMkBBGAABxrbm5WUVFRabLCJvKykpNnDjRdBkhIYwAAOJaZmamKisrI3qM5uZmrV69WitWrFBmZmZEjxXp/UcCYQQAENdsNlufjSRkZmbG3KhFX2ACKwAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMuqQwUl5ernHjxslmsyk7O1v79++/YP/W1lYtX75c6enpslqtuvrqq7Vjx45LKhgAAPQvA0LdoKamRg6HQxUVFcrOztbGjRuVl5enpqYmjRo1qkt/j8ej73//+xo1apR+/etfa8yYMWpublZqamo46gcAADEu5DCyYcMGFRUVqbCwUJJUUVGhF198UVVVVbr//vu79K+qqtKnn36qffv2aeDAgZKkcePGXV7VAACg3wjpMo3H41FjY6Nyc3O/3kFionJzc9XQ0NDtNi+88IJycnK0fPly2e12XXfddVqzZo28Xu/lVQ4AAPqFkEZGTp48Ka/XK7vdHtRut9t1+PDhbrd577339PLLL2vBggXasWOHjhw5omXLluns2bNauXJlt9t0dHSoo6Mj8NntdodSJgAAiCERv5vG5/Np1KhReuaZZ5SVlaWCggI9+OCDqqio6HGbsrIypaSkBJaMjIxIlwkAAAwJKYyMHDlSSUlJcrlcQe0ul0tpaWndbpOenq6rr75aSUlJgbZrrrlGTqdTHo+n221KSkrU1tYWWI4ePRpKmQAAIIaEFEYsFouysrJUV1cXaPP5fKqrq1NOTk6328yaNUtHjhyRz+cLtL3zzjtKT0+XxWLpdhur1ark5OSgBQAA9E8hX6ZxOByqrKzU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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "seaborn.boxplot({**jpeg_res['phash'].stats(), 'a': compute_random_dists(jpeg_res['phash'].orig_hashes)})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2000it [00:11, 179.31it/s]\n",
      "2000it [02:05, 15.98it/s]\n",
      "2000it [00:10, 197.95it/s]\n",
      "2000it [02:05, 15.93it/s]\n",
      "2000it [00:10, 193.70it/s]\n",
      "2000it [02:06, 15.86it/s]\n",
      "2000it [00:38, 51.49it/s]\n",
      "2000it [02:33, 13.01it/s]\n"
     ]
    }
   ],
   "source": [
    "save_dists_excel((mf_res := get_res(ops.distortion_factory(ops.median_filter, [9]), limit=2000)), 'mf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{9: (0.0, 0.1875, 0.015984375)}"
      ]
     },
     "execution_count": 437,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mf_res['phash'].stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 438,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAlLElEQVR4nO3df3RU9Z3/8VcmZmYQyIhGJpCfX0SkLErahKQBf/U0Xayohz0rJ2urYXMU/HaNp+3U3ZLNNlTcMP5gac4KxyQstLtylCxs6+kRDOvOOdSjZk0Jx7NoS1zbr5mk7IxJrTOQQoadyfcPDyMDCWRCJp+ZyfNxzj0yn/v5zH3POSbzyud+7r0ZIyMjIwIAADDEYroAAAAwvRFGAACAUYQRAABgFGEEAAAYRRgBAABGEUYAAIBRhBEAAGAUYQQAABh1lekCxiMSiejEiROaPXu2MjIyTJcDAADGYWRkRCdPntT8+fNlsYw9/5ESYeTEiRMqKCgwXQYAAJiAvr4+5efnj7k/JcLI7NmzJX32YbKzsw1XAwAAxiMYDKqgoCD6PT6WlAgj507NZGdnE0YAAEgxl1tiwQJWAABgFGEEAAAYRRgBAABGEUYAAIBRhBEAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQDAlOjv79ddd92lr3zlK7rrrrvU399vuiQkiZS4AysAILV99atfVTgcjr4+c+aMHnzwQWVmZsrj8RisDMmAmREAQEKdH0Sys7P1ve99L/poj3A4rK9+9asmy0MSYGYEAJAw/f390SCyf/9+5eTkSJLuvfdeDQ4O6v7771c4HFZ/f/8ln+qK9MbMCAAgYR555BFJn82InAsi5+Tk5ESf5nquH6YnwggAIGGGh4clSevXrx91f21tbUw/TE+EEQBAwthsNknSzp07R93/4x//OKYfpifCCAAgYf7pn/5JkhQMBjU4OBizb3BwUCdPnozph+mJBawAgITJz89XZmamwuGw7r//fs2ePVu1tbX68Y9/HA0imZmZLF6d5jJGRkZGTBdxOcFgUA6HQ4FAIHo5GAAgdVx4n5FzuM9Iehvv9/eETtPs2LFDxcXFstvtqqioUFdX15h977zzTmVkZFy0rV69eiKHBgCkII/Hoz179shutysjI0N2u1179uwhiEDSBE7TtLe3y+VyqaWlRRUVFWpubtaqVavU09OjuXPnXtT/pz/9qUKhUPT173//ey1btkxr1669ssoBACklPz9fHR0dpstAEop7ZmTbtm1av369amtrtWTJErW0tOjqq6/W7t27R+1/7bXXKjc3N7q9/vrruvrqqwkjAABAUpxhJBQKqbu7W1VVVZ+/gcWiqqoqdXZ2jus9du3apb/4i7/QzJkzx+wzPDysYDAYswEAgPQUVxgZHBxUOByW0+mMaXc6nfL5fJcd39XVpffee++yd9pzu91yOBzRraCgIJ4yAQBACpnS+4zs2rVLN998s8rLyy/Zr76+XoFAILr19fVNUYUAgEQ5cuSI7rzzzuh25MgR0yUhScS1gDUnJ0eZmZny+/0x7X6/X7m5uZccOzQ0pL1792rz5s2XPY7NZuNufACQRu68886L2p544glJ0uHDh6e2GCSduGZGrFarSktLYy7FikQi8ng8qqysvOTYffv2aXh4WA8++ODEKgUApKQLg8itt956yf2YfuK+tNflcmndunUqKytTeXm5mpubNTQ0FH3YUU1NjfLy8uR2u2PG7dq1S2vWrNF11103OZUDAJLe+aditm/frqVLl0Zfv/fee6qrq4v2Kysrm/L6kBziDiPV1dUaGBhQY2OjfD6fSkpK1NHREV3U6vV6ZbHETrj09PTozTff1L//+79PTtUAgJRw7lSMpJggcuHrJ554gtM109iEnk1TV1cXTbMXGu1/pptuukkpcNd5AECCXHhq5pyKigq98847U1wNkg1P7QUAJNybb745ajtBBBJhBACQQFu3bo3++7333ovZd/7r8/th+pnQaRoAAMbj/EWp507vj3ZqhsWr0xszIwCAhLpwLeGFQYSFqyCMAAAS7vDhwxeditm6dStBBJI4TQMAmCJlZWWED4yKmREAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARnGfEQBIAWfOnJHX6zVdBs5TWFgou91uuoy0QBgBgBTg9Xq1YcMG02XgPG1tbVq0aJHpMtICYQQAUkBhYaHa2tpMl3HFent71dTUpIaGBhUVFZku54oUFhaaLiFtEEYAIAXY7fa0+iu8qKgorT4PrgwLWAEAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABgFGEEAAAYRRgBAABGEUYAAIBRhBEAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRh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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "seaborn.boxplot({**mf_res['phash'].stats(), 'a': compute_random_dists(mf_res['phash'].orig_hashes, 100)})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 314,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plt.ylim(0, 1)\n",
    "seaborn.boxplot(scale_res['whash'].stats())\n",
    "# seaborn.boxplot(scale_res['whash'].stats())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0.1: (0.0, 0.15625, 0.013625), 0.2: (0.0, 0.28125, 0.0206875)}"
      ]
     },
     "execution_count": 406,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sp_noise_res['phash'].stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0.02: (0.0, 0.171875, 0.062125),\n",
       " 0.05: (0.0, 0.328125, 0.15153125),\n",
       " 0.1: (0.015625, 0.546875, 0.2869375)}"
      ]
     },
     "execution_count": 307,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "crop_res['dhash'].stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 308,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGiCAYAAAA1LsZRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqaElEQVR4nO3dfXRU9Z3H8c8QmBl5SIYHmSQQJgWVhyoPhSZGrOjZlPQouDnqQlEblkK0LHjAFFDWQNSmxlKhaRVlieDDCgVRoVo4KGTlcLrBspJyuirYis0AQgZomoQEk4Hk7h8sI0PCw4SZ/JLM+3XOPWZ+87v39x3v2Pn03t+912ZZliUAAABDOpkuAAAARDfCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADAq5DCyc+dOTZw4UYmJibLZbNq0adNl19mxY4e+853vyOFw6LrrrtOrr77aglIBAEBHFHIYqa2t1YgRI7R8+fIr6v+3v/1Nd911l+644w7t3btXc+fO1YwZM/T++++HXCwAAOh4bFfzoDybzaaNGzcqMzPzon0ee+wxbd68WZ988kmg7Yc//KEqKyu1devWlg4NAAA6iM6RHmDXrl1KT08PasvIyNDcuXMvuk59fb3q6+sDrxsbG1VRUaHevXvLZrNFqlQAABBGlmXp5MmTSkxMVKdOFz8ZE/EwUl5eLrfbHdTmdrtVXV2tr7/+Wtdcc02TdQoKCvTUU09FujQAANAKDh06pP79+1/0/YiHkZZYuHChcnJyAq+rqqo0YMAAHTp0SLGxsQYrAwAAV6q6ulpJSUnq0aPHJftFPIzEx8fL5/MFtfl8PsXGxjZ7VESSHA6HHA5Hk/bY2FjCCAAA7czlplhE/D4jaWlpKi4uDmrbtm2b0tLSIj00AABoB0IOIzU1Ndq7d6/27t0r6eylu3v37tXBgwclnT3FkpWVFej/k5/8RF9++aUWLFig/fv368UXX9Sbb76pRx99NDyfAAAAtGshh5GPP/5Yo0aN0qhRoyRJOTk5GjVqlBYvXixJOnr0aCCYSNK3vvUtbd68Wdu2bdOIESO0dOlSvfzyy8rIyAjTRwAAAO3ZVd1npLVUV1crLi5OVVVVzBkBAKCduNLfb55NAwAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAqBaFkeXLlys5OVlOp1OpqanavXv3JfsXFhZq8ODBuuaaa5SUlKRHH31UdXV1LSoYAAB0LCGHkfXr1ysnJ0d5eXkqLS3ViBEjlJGRoWPHjjXbf+3atXr88ceVl5enffv2adWqVVq/fr3+/d///aqLBwAA7V/IYWTZsmXKzs7WtGnTNGzYMK1YsUJdu3bV6tWrm+1fUlKisWPH6v7771dycrLGjx+vKVOmXPZoCgAAiA4hhRG/3689e/YoPT39mw106qT09HTt2rWr2XVuueUW7dmzJxA+vvzyS23ZskV33nnnRcepr69XdXV10AIAADqmzqF0PnHihBoaGuR2u4Pa3W639u/f3+w6999/v06cOKFbb71VlmXpzJkz+slPfnLJ0zQFBQV66qmnQikNAAC0UxG/mmbHjh165pln9OKLL6q0tFTvvPOONm/erJ/97GcXXWfhwoWqqqoKLIcOHYp0mQAAwJCQjoz06dNHMTEx8vl8Qe0+n0/x8fHNrrNo0SL96Ec/0owZMyRJN910k2pra/XQQw/piSeeUKdOTfOQw+GQw+EIpTQAANBOhXRkxG63a/To0SouLg60NTY2qri4WGlpac2uc+rUqSaBIyYmRpJkWVao9QIAgA4mpCMjkpSTk6OpU6dqzJgxSklJUWFhoWprazVt2jRJUlZWlvr166eCggJJ0sSJE7Vs2TKNGjVKqamp+uKLL7Ro0SJNnDgxEEoAAED0CjmMTJ48WcePH9fixYtVXl6ukSNH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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.ylim(0, 1)\n",
    "seaborn.boxplot({**crop_res['dhash'].stats(), 'random': compute_random_dists(flip_res['dhash'].orig_hashes, 100)})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5000\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(0.9897866666666665, 0.99855, 0.9921593650793651)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "search_metrics.test_T(hash_name='phash',\n",
    "                      res=jpeg_res,\n",
    "                      T=0.09,\n",
    "                      train_size=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4978, 3)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "T=0.09\n",
    "h = 'phash'\n",
    "np.sum(np.array(jpeg_res[h].param2dist[10]) < T), sum(compute_random_dists(jpeg_res[h].orig_hashes) < T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{9: (0.0, 0.125, 0.0159375)}"
      ]
     },
     "execution_count": 433,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mf_res['phash'].stats()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "T=0.01: precision=1.0, recall=0.805, f1=0.8700000000000003\n",
      "T=0.02: precision=1.0, recall=0.805, f1=0.8700000000000003\n",
      "T=0.03: precision=1.0, recall=0.805, f1=0.8700000000000003\n",
      "T=0.04: precision=1.0, recall=0.975, f1=0.9833333333333334\n",
      "T=0.05: precision=1.0, recall=0.975, f1=0.9833333333333334\n",
      "T=0.06: precision=1.0, recall=0.975, f1=0.9833333333333334\n",
      "T=0.07: precision=1.0, recall=1.0, f1=1.0\n",
      "T=0.08: precision=1.0, recall=1.0, f1=1.0\n",
      "T=0.09: precision=1.0, recall=1.0, f1=1.0\n",
      "T=0.1: precision=1.0, recall=1.0, f1=1.0\n"
     ]
    }
   ],
   "source": [
    "search_metrics.train_T(hash_name='phash', \n",
    "                       res=mf_res, \n",
    "                       train_size=100,\n",
    "                       from_t=0.01,\n",
    "                       to_t=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
